package com.zhuchang.self_rpc.test.democoding.nettydemo;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.util.CharsetUtil;

import java.nio.ByteBuffer;

/**
 * @Author RenPu
 * @Date 2022/2/9 11:06
 * @Version 1.0
 * @Description:  自定义业务逻辑处理，扩展使用（服务端的编码处理）
 *
 *
/**
 * 说明
 * 1. 我们自定义一个Handler 需要继续netty 规定好的某个HandlerAdapter(规范)
 * 2. 这时我们自定义一个Handler , 才能称为一个handler
 */
public class NettyServerHandler extends ChannelInboundHandlerAdapter {



    //1：ChannelHandlerContext 上下文对象，拥有pipeline,通道channel,地址：
    //2：Object 客户端默认发送的消息数据，默认是Object

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        System.out.println("服务器读取线程 " + Thread.currentThread().getName() + " channle =" + ctx.channel());
        System.out.println("server ctx =" + ctx);
        System.out.println("看看channel 和 pipeline的关系");


        //从上下文获取channel对象
        Channel channel = ctx.channel();
        //从上下文获取pipeline对象
        ChannelPipeline pipeline = ctx.pipeline();

        //将对msg转为ByteBuffer对象，并设置编码的格式
        ByteBuf byteBuf =(ByteBuf)msg;

        System.out.println("客户端发送的消息是："+byteBuf.toString(CharsetUtil.UTF_8));
        System.out.println("客户端的地址是："+channel.remoteAddress());
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

        //写入缓存，并刷新到客户端
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客户端~o( =∩ω∩= )",CharsetUtil.UTF_8));
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
       ctx.close();
    }
}
